<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * Jaypha模板标签模型
 * @author 		jaypha
 * @qq			168007694
 * @email		psufool@163.com
 * @home page	www.psufool.cn
 */
class JayphaTemplate extends CI_Model{

	function __construct(){
		parent::__construct();
		$this->array_key_arr = array(strtolower('distinct')
				,strtolower('field')
				,strtolower('table')
				,strtolower('joinType')
				,strtolower('joinTable')
				,strtolower('joinOn')
				,strtolower('where')
				,strtolower('whereIn')
				,strtolower('whereInField')
				,strtolower('like')
				,strtolower('likeField')
				,strtolower('notLike')
				,strtolower('notLikeField')
				,strtolower('orLike')
				,strtolower('orLikeField')
				,strtolower('orNotLike')
				,strtolower('orNotLikeField')
				,strtolower('order')
				,strtolower('top'));
		$this->page_tag_config = array('num_links'
			,'base_url'
			,'total_rows'
			,'per_page'
			,'uri_segment'
			,'full_tag_open'
			,'full_tag_close'
			,'first_link'
			,'first_tag_open'
			,'first_tag_close'
			,'last_link'
			,'last_tag_open'
			,'last_tag_close'
			,'next_link'
			,'next_tag_open'
			,'next_tag_close'
			,'prev_link'
			,'prev_tag_open'
			,'prev_tag_close'
			,'cur_tag_open'
			,'cur_tag_close'
			,'num_tag_open'
			,'num_tag_close'
			,'display_pages'
		);
	}

	/**
	 * 过滤HTML标签
	 * @param $string				待过滤字符串
	 * @param $tag					要过滤的HTML标签，默认为所有HTML标签
	 * @param $type					过滤类型，0：只过滤标签；1：过滤标签及标签之间的内容
	 * @param $enter				是否过滤回车符、换行符，默认为true过滤
	 * @param $tab					是否过滤制表符，默认为true过滤
	 */
	function filterHtml($string,$tag="all",$type=0,$enter=true,$tab=true){
		if(strlen($string)==0) return;
		if(strlen($tag)==0) $tag = 'all';
		if($type==0){
			if(strtolower($tag)=='all'){
				$pattern = array("'<script[^>]*?>.*?</script>'si",
								"'<[\/\!]*?[^<>]*?>'si");
			}else{
				$tag_arr = explode(',',$tag);
				for($i=0;$i<count($tag_arr);$i++){
					$pattern[$i] = "'<$tag_arr[$i][\/\!]*?[^<>]*?>|<[\/\!]$tag_arr[$i]*?>'si";
				}
			}	
		}else{
			if(strtolower($tag)=='all'){
				$pattern = "'<[\s\S]*?>[\s\S]*?<\/[\s\S]*?>'si";
			}else{
				$tag_arr = explode(',',$tag);
				for($i=0;$i<count($tag_arr);$i++){
					$pattern[$i] = "'<$tag_arr[$i][\s\S]*?>[\s\S]*?<\/$tag_arr[$i]>'si";
				}
			}
		}
		$replace = '';
		$string = preg_replace($pattern,$replace,$string);
		if($enter) $string = $this->filterEnter($string);
		if($tab) $string = $this->filterTab($string);
		return $string;
	}
	
	/**
	 * 过滤回车符、换行符
	 * @param $string			待过滤的字符串
	 * @param $num				过滤次数，默认为-1：表示全部过滤
	 */
	function filterEnter($string,$num=-1){
		$pattern = '/\n|\r/si';
		$replace = '';
		$string = preg_replace($pattern,$replace,$string,$num);		
		return $string;
	}
	
	/**
	 * 过滤制表符
	 * @param $string			待过滤的字符串
	 * @param $num				过滤次数，默认为-1：表示全部过滤
	 */
	function filterTab($string,$num=-1){
		$pattern = '/\t/si';
		$replace = '';
		$string = preg_replace($pattern,$replace,$string,$num);
		return $string;
	}
	
	/**
	 * 获取附加表字段
	 * @param $fields			字段列表字符串
	 * @param returnType		返回类型：    -1、返回所有
	 * 									    0、返回列表标签字符串数组
	 * 									    1、返回字段名数组
	 * 									    2、返回列表中“属性=属性值”字符串数组
	 * 									    3、返回“字 段名=>属性=>属性值” 二维数组
	 */
	function getSubjoinFields($fields,$returnType=-1){
		if(!is_numeric($returnType)) return null;
		$pattern = "'<field:([a-z0-9]*)([\s\S]*?)\/>|<field:([a-z0-9]*)([\s\S]*?)>[\s\S]*?<\/field:([a-z0-9]*)>'i";
		if(preg_match_all($pattern,$fields,$match)){	
			for($i=0;$i<count($match[0]);$i++){
				if(strlen($match[1][$i])==0){
					//形如：<field:字段名 属性></field:字段名>的情况
					$match[1][$i] = $match[3][$i];
					$match[2][$i] = $match[4][$i];
				}
				unset($match[3][$i]);
				$match[3][$match[1][$i]] = $this->getAttributes($match[2][$i]);				
			}
			unset($match[4]);
			unset($match[5]);
			if($returnType==-1){
				return $match;
			}elseif($returnType<4 && $returnType>-1){
				return $match[$returnType];
			}else{
				return null;
			}
		}else{
			return null;
		}
	}
	
	/**
	 * 通过附加表字段名获取附加表字段相关信息
	 * @param $fieldName			字段名
	 * @param $fields				字段列表字符串
	 * @param $returnType			返回类型：	-1、返回全部
	 * 											 0、返回列表标签字符串数组
	 * 											 1、返回列表中“属性=属性值”字符串
	 * 											 2、返回“属性=>属性值” 数组
	 */
	function getSubjoinFieldsByName($fieldName,$fields,$returnType=-1){		
		if(!is_numeric($returnType)) return null;
		$pattern = "'<field:$fieldName([\s\S]*?)\/>|<field:$fieldName([\s\S]*?)>[\s\S]*?<\/field:$fieldName>'i";
		if(preg_match($pattern,$fields,$match)){
			if(strlen($match[1])==0) $match[1] = $match[2];
			$match[2] = $this->getAttributes($match[1]);			
			if($returnType==-1){
				return $match;
			}elseif($returnType<3 && $returnType>-1){
				return $match[$returnType];
			}else{
				return null;
			}
		}else{
			return null;
		}
	}

	/**
	 * 获取属性
	 * @param $attributes		属性字符串
	 * @return					返回属性数组（以属性名作为数组键，属性值作为对应数组值）形如：$a['b']=c
	 */
	function getAttributes($attributes){
		$pattern = "'([a-z0-9_]*)=\"([\s\S]*?)\"|([a-z0-9_]*)=\'([\s\S]*?)\''i";
		preg_match_all($pattern,$attributes,$match);
		$arr_key = $arr_value = array();
		for($i=0;$i<count($match[0]);$i++){			
			if(strlen($match[1][$i])==0){				
				//属性值用单引号“'”括起来的情况
				$match[3][$i] = strtolower($match[3][$i]);
				array_push($arr_key,$match[3][$i]);
				array_push($arr_value,$match[4][$i]);
			}else{
				//属性值用双引号“"”括起来的情况
				$match[1][$i] = strtolower($match[1][$i]);
				array_push($arr_key,$match[1][$i]);
				array_push($arr_value,$match[2][$i]);
			}
		}
		unset($i);
		unset($match);
		if(count($arr_key)>0){
			$match = array_combine($arr_key,$arr_value);
		}else{
			$match = array();
		}
		unset($arr_key);
		unset($arr_value);
		return $match;
	}
	
	/**
	 * 获取field标签
	 * @param $tags				字符串
	 * @return					返回一个以标签名作为键，以标签字符串为值的数组
	 */
	function fieldTag($tags){
		//{field.content}{/field.content}|{field.content/}
		$pattern = "'{field\.([a-z0-9]*?)(.*)\/}|{field\.([a-z0-9]*?)(.*)}([\s\S]*){\/field\.[a-z0-9]*?}'iU";
		if(preg_match_all($pattern,$tags,$match,PREG_SET_ORDER)){
			for($i=0;$i<count($match);$i++){
				if(count($match[$i])==3){
					$match[$i][3] = '';	
				}else if(count($match[$i])==6){
					$match[$i][1] = $match[$i][3];
					$match[$i][2] = $match[$i][4];
					$match[$i][3] = $match[$i][5];
					unset($match[$i][4]);
					unset($match[$i][5]);
				}
				$match[$i][2] = $this->getAttributes($match[$i][2]);
				if(count($match[$i][2])==0) $match[$i][2] = '';
			}
		}
		return $match;
	}

	/**
	 * 获取sys系统标签
	 * @param $tags				字符串
	 * @return					返回一个以标签名作为键，以标签字符串为值的数组
	 */
	function sysTag($tags){
		$pattern = "'\{sys:(.*)\}.*\{\/sys:(.*)\}|\{sys:(.*)\/\}|\{sys:(.*)\}'i";
		preg_match_all($pattern,$tags,$match);
		$arr_key = $arr_value = array();
		for($i=0;$i<count($match[0]);$i++){
			if(strlen($match[1][$i])==0){
				if(strlen($match[2][$i])!=0){
					$match[1][$i] = $match[2][$i];
				}elseif(strlen($match[3][$i])!=0){
					$match[1][$i] = $match[3][$i];
				}else{
					$match[1][$i] = $match[4][$i];
				}
			}
			if(strlen($match[1][$i])!=0){
				array_push($arr_key,$match[1][$i]);
				array_push($arr_value,$match[0][$i]);
			}
		}
		unset($i);
		unset($match);
		if(count($arr_key)>0){
			$match = array_combine($arr_key,$arr_value);
		}else{
			$match = array();
		}
		unset($arr_key);
		unset($arr_value);
		return $match;
	}

	/**
	 * 获取inc导入标签
	 * @param $tags				字符串
	 * @return					返回一个以文件名作为键，以标签字符串为值的数组
	 */
	function incTag($tags){
		$pattern = "'\{inc:([\s\S]*?)\/\}|\{inc:([\s\S]*?)\}'i";
		preg_match_all($pattern,$tags,$match);
		$arr_key = $arr_value = array();
		for($i=0;$i<count($match[0]);$i++){
			if(strlen($match[1][$i])==0){
				if(strlen($match[2][$i])!=0){
					$match[1][$i] = $match[2][$i];
				}elseif(strlen($match[3][$i])!=0){
					$match[1][$i] = $match[3][$i];
				}else{
					$match[1][$i] = $match[4][$i];
				}
			}
			if(strlen($match[1][$i])!=0){
				array_push($arr_key,trim($match[1][$i]));
				array_push($arr_value,$match[0][$i]);
			}
		}
		unset($i);
		unset($match);
		if(count($arr_key)>0){
			$match = array_combine($arr_key,$arr_value);
		}else{
			$match = array();
		}
		unset($arr_key);
		unset($arr_value);
		return $match;
	}

	/**
	 * 获取if判断标签
	 * @param $tags				字符串
	 * @return					返回一个二维数组，一维数组是原字符，二维数组是判断后的取值
	 */
	function ifTag($tags){
		$pattern = "'\{if:([\s\S]*?)\}([\s\S\n.]*?)\{\/if\}'i";
		$pattern2 = "'([\s\S]*?)\{else\}([\s\S]*)'i";
		if(preg_match_all($pattern,$tags,$match)){			
			$match[3] = array();
			for($i=0;$i<count($match[0]);$i++){
				if(preg_match_all($pattern2,$match[2][$i],$match2)){
					for($j=0;$j<count($match2[0]);$j++){
						$eval_str = "if(".$match[1][$i]."){
								\$match[3][$i] = \"" . str_replace('"','\"',$match2[1][$j]) . "\";
							}else{
								\$match[3][$i] = \"" . str_replace('"','\"',$match2[2][$j]) . "\";
							}";
						@eval($eval_str);
					}
					unset($j);
					unset($match2);
				}else{
					$eval_str = "if(".$match[1][$i]."){
							\$match[3][$i] = \"" . str_replace('"','\"',$match[2][$i]) . "\";
						}else{
							\$match[3][$i] = \"\";
						}";
					@eval($eval_str);
				}
				unset($eval_str);
			}
			unset($i);
			unset($pattern2);
			unset($match[1]);
			unset($match[2]);
			$match[1]=$match[3];
			unset($match[3]);
		}
		return $match;
	}

	/**
	 * 获取list列表标签
	 * @param $tags				字符串
	 * @return					返回一个数组
	 */
	function listTag($tags){
		$pattern = "'\{list:([\s\S]*?)\}([\s\S]*?)\{\/list\}'si";
		$pattern2 = "'\[list:([\w]*?)([\s\S]*)\]([\s\S]*)\[\/list:[\w]*?\]'siU";
		if(preg_match_all($pattern,$tags,$match,PREG_SET_ORDER)){
			for($i=0;$i<count($match);$i++){
				//{list}获取标签属性
				$match[$i][3] = $this->getAttributes($match[$i][1]);
				foreach($this->array_key_arr as $exists_key){
					if(!array_key_exists($exists_key,$match[$i][3])){
						$match[$i][3][$exists_key] = '';
					}
				}
				
				$pattern3 = "'\[list:([\w]*?)([\s\S]*)\/\]'siU";
				$pattern_replace_string = "[list:$1$2][/list:$1]";
				$match[$i][2] = preg_replace($pattern3, $pattern_replace_string,$match[$i][2]);
				unset($pattern3);
				unset($pattern_replace_string);
				
				if(preg_match_all($pattern2,$match[$i][2],$match2,PREG_SET_ORDER)){					
					for($j=0;$j<count($match2);$j++){
						if(strlen($match2[$j][2])>0){
							//获取[list]标签属性
							$match2[$j][2] = $this->getAttributes($match2[$j][2]);							
						}
					}
				}				
				$match[$i][4] = $match2;
				unset($match2);
				$match[$i][1] = $match[$i][3];
				$match[$i][3] = $match[$i][4];
				unset($match[$i][4]);
			}
			return $match;
		}
	}
	
	/**
	 * 获取do循环标签
	 * @param $tags				字符串
	 * @return					返回一个数组
	 */
	function doTag($tags){
		$pattern = "'\{do:([\s\S]*?):([\s\S]*?)\}([\s\S]*?)\{\/do\}'i";
		if(preg_match_all($pattern,$tags,$match,PREG_SET_ORDER)){
			for($i=0;$i<count($match);$i++){
				//$pattern2 = "'\[do:".$match[$i][1].":([a-z0-9]*?)(.*)\/\]'iU";
				$pattern2 = "'\[do:".$match[$i][1].":([\w]*?)([\s\S]*)\]([\s\S]*)\[\/do:".$match[$i][1].":[\w]*?\]'iU";
				//获取{do}标签属性
				$match[$i][4] = $this->getAttributes($match[$i][2]);
				foreach($this->array_key_arr as $exists_key){
					if(!array_key_exists($exists_key,$match[$i][4])){
						$match[$i][4][$exists_key] = '';
					}
				}
				
				$pattern3 = "'\[do:".$match[$i][1].":([\w]*?)([\s\S]*)\/\]'isU";
				$pattern_replace_string = "[do:".$match[$i][1].":$1$2][/do:".$match[$i][1].":$1]";
				$match[$i][3] = preg_replace($pattern3,$pattern_replace_string,$match[$i][3]);
				unset($pattern3);
				unset($pattern_replace_string);
				
				//获取[do]标签属性
				if(preg_match_all($pattern2,$match[$i][3],$match2,PREG_SET_ORDER)){
					for($j=0;$j<count($match2);$j++){
						$match2[$j][2] = $this->getAttributes($match2[$j][2]);
						if(count($match2[$j][2])==0)
							$match2[$j][2] = null;
					}
				}
				$match[$i][5] = $match[$i][3];
				$match[$i][2] = $match[$i][4];
				$match[$i][3] = $match2;
				$match[$i][4] = $match[$i][5];
				unset($match2);
				unset($match[$i][5]);
			}
		}
		//print_r($match);
		//exit;
		return $match;
	}
	
	/**
	 * 获取page分页标签
	 * @param $tags				字符串
	 * @return					返回一个数组
	 */
	function pageTag($tags){
		/**
		 * {page:get_db_config_attributes}
		 * [page:list page_config_attributes]
		 * [page:list:title len='12'/][page:list:createTime formattime='Y-m-d'/]
		 * [/page:list]
		 * 第[page:currentpage/]/[page:pagetotal/]页 每页[page:pagesize/]条记录 [page:create_links/]
		 * {/page}
		 */
		$pattern = "'{page:([\s\S]*?)}([\s\S]*?){\/page}'i";
		if(preg_match_all($pattern,$tags,$match,PREG_SET_ORDER)){
			for($i=0;$i<count($match);$i++){
				//获取{page的属性}
				$match[$i][3] = $this->getAttributes($match[$i][1]);
				foreach($this->array_key_arr as $exists_key){
					if(!array_key_exists($exists_key,$match[$i][3])){
						$match[$i][3][$exists_key] = '';
					}
				}
				//获取[page:list]属性
				$pattern2 = "'\[page:list([\s\S]*?)\]([\s\S]*?)\[\/page:list\]'i";
				if(preg_match_all($pattern2,$match[$i][2],$match2,PREG_SET_ORDER)){
					$match2[0][1] = $this->getAttributes($match2[0][1]);
					foreach($this->page_tag_config as $exists_key){
						if(!array_key_exists($exists_key,$match2[0][1])){
							$match2[0][1][$exists_key] = '';
						}
					}
					$pattern3 = "'\[page:list:([\w]*?)([\s\S]*)\]([\s\S]*)\[\/page:list:[\w]*?\]'isU";
					
					$pattern4 = "'\[page:list:([\w]*?)([\s\S]*)\/\]'siU";
					$pattern_replace_string = "[page:list:$1$2][/page:list:$1]";
					$match2[0][2] = preg_replace($pattern4, $pattern_replace_string,$match2[0][2]);
					unset($pattern4);
					unset($pattern_replace_string);
					
					if(preg_match_all($pattern3,$match2[0][2],$match3,PREG_SET_ORDER)){
						for($j=0;$j<count($match3);$j++){
							$match3[$j][2] = $this->getAttributes($match3[$j][2]);
							if(count($match3[$j][2])==0)
								$match3[$j][2] = null;
						}
						$match2[0][3] = $match2[0][2];
						$match2[0][2] = $match3;
					}
					$match[$i][1] = $match[$i][3];
					$match[$i][3] = $match2[0];
				}
			}
		}
		return $match;
	}
}

/* End of file JayphaTemplate.php */
/* Location: ./application/controllers/admin/JayphaTemplate.php */